#ifndef _PUBLIC_H_
#define _PUBLIC_H_
#include <iostream>
using namespace std;

typedef unsigned long long uint64;

// 文件分块传输的块大小 2k
static const int BLOCK_SIZE = 2048;  

// 操作类型
enum OperType
{
    TYPE_DIR,       // 操作目录 
    TYPE_DOWNLOAD,  // 下载文件
    TYPE_UPLOAD,    // 上传文件
    TYPE_ACK,
    TYPE_AUTH,
};

// 文件类型
enum FileType
{
    TYPE_NORMAL,    // 普通传输
    TYPE_QUICK,     // 秒传
    TYPE_EXIST,     // 文件已经存在
};

// 通用网络数据包
struct DataPacket
{
    int datalen;    // 弹性数组数据长度
    OperType type;  // 当前数据包代表的操作类型
    char data[0];   // 存储相应操作下的数据内容
};

// 命令以及参数打包
struct CommandData
{
    char cmd[128];   // 命令
    char args[128];  // 参数
};

// 文件上传数据
struct UploadFile
{
    char filepath[128];  // 文件路径
    uint64 filesize;     // 文件大小
    char md5[33];        // 32位的md5值
};

struct UploadFileAck
{
    FileType type;       // 文件上传类型
    int blockno;         // 如果是普传，表示开始的文件块号
};

struct TransferFile
{
    int blockno;
    char content[BLOCK_SIZE];
};

struct TransferFileAck
{
    char progress[5];    // 存储进度字符串
};


#define CheckErr(ret, str) \
    do \
    { \
        if (ret < 0) \
        { \
            cout << __FILE__ << ":" << __LINE__ << endl; \
            perror(str); \
            exit(-1); \
        } \
    } while(0)


#endif